package VWorldGameStudio;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Random;

/**
 * 行为动作属性类
 *
 * @author jungle
 */
public class FCAction extends Sprite implements Serializable, Cloneable {

    // 动作名
    private String name;
    // 动作类型:随机行走（random）、原地踏步（step）、原地不动（fixed）、指定路线（TODO）
    private String type;
    // 首次朝向
    private int face = 0;
    // 指定路线记录处，格式 方向 - 步数
    private ArrayList<String> fixedRouteList = new ArrayList<String>();

    private int countTimes = 0;
    // 动作类型
    public static final String TYPE_RANDOM = "random";
    private static final String TYPE_STEP = "step";
    private static final String TYPE_FIXED = "fixed";//编辑的时候是 0-1  表示向下走1步， 1-2 表示向左走2步， 2 右边 3上边
    public static final String TYPE_RANDOM_DIR = "randomaction";//站住随机方向

    public FCAction(String name, String type, int face, ArrayList<String> fixedRouteList) {
        this.name = name;
        this.type = type;
        this.face = face;
        this.fixedRouteList = fixedRouteList;
    }

    /**
     * 注册
     *
     * @param name
     * @param type
     * @param face
     * @param fixedRouteList
     */
    public void registerAction(String name, String type, int face, ArrayList<String> fixedRouteList) {
        this.name = name;
        this.type = type;
        this.fixedRouteList = fixedRouteList;
        this.face = face;
    }

    Random random = new Random();

    /**
     * 获取NPC的路线编号、路向和步数,根据当前方向和路线编号
     *
     * @param dire     路向
     * @param fixedNum
     * @return int[]{ 路线编号， 方向， 步数 }
     */
    public int[] getNPCAction(int dire, int fixedNum, boolean isFinish) {
        // 随机行走
        if (TYPE_RANDOM.equals(type)) {
            // 路线编号: -1; 路向:0 ~ 3; 步数: 因为方向已经指名了正反,所以步数一定要是大于等于0 不能-

            return new int[]{-1, random.nextInt(4), Math.max(4, random.nextInt(12))};
        }

        // 原地踏步
        if (TYPE_STEP.equals(type)) {
            // 路线编号: -1; 路向: dire指定; 步数: -1
            return new int[]{-1, dire, 0};
        }

        if (TYPE_RANDOM_DIR.equals(type)) {
            // 路线编号: -1; 路向: dire指定; 步数: -1
            return new int[]{-1, dire, 0};
        }
        // 路线
        if (TYPE_FIXED.equals(type)) {
            // 第n个值和第(n+1)个相等时为原地不动，动作保持第n个，否则动作为第(n+1)个
//			if (fixedRouteList.get(fixedNum).equals(fixedRouteList.get(fixedNum + 1))) {
//				fixedRoute = fixedRouteList.get(fixedNum);
//			} else {
            if (!isFinish && fixedNum != 0) {//未达成目标,就等
                return new int[]{fixedNum, dire, 0};
            }
            if (fixedNum < fixedRouteList.size()) {
                String fixedRoute = fixedRouteList.get(fixedNum);
                int newDir = Integer.parseInt(fixedRoute.split("-")[0]);
                int newSteps = Integer.parseInt(fixedRoute.split("-")[1]);
                System.out.println("  " + newDir + " " + newSteps + " " + fixedNum);
                return new int[]{fixedNum + 1, newDir, Math.max(0, newSteps)};
            } else {
                //TODO 当线路走完了怎么办,那就停住吧，不管了
                return new int[]{fixedNum, dire, 0};
            }
            //}
        }
        // 路线编号: -1; 路向: dire指定; 步数: 0
        return new int[]{-1, dire, 0};
    }

    public int getRandomDir(int oldDir) {
        countTimes++;
        if(countTimes >= Integer.MAX_VALUE){
            countTimes = 0;
        }
        if (countTimes % 8 == 0) {
            return random.nextInt(4);
        } else {
            return oldDir;
        }
    }

    public int getFace() {
        return face;
    }

    public void setFace(int dir) {
        face = dir;
    }

    public String getName() {
        return name;
    }

    public String getType() {
        return type;
    }

    public ArrayList<String> getFixedRoute() {
        return fixedRouteList;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setType(String type) {
        this.type = type;
    }

    public FCAction getClone() {
        try {
            return (FCAction) super.clone();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}
